#include <iostream>
#include <stdlib.h>

/*
    链表的基础节点，包含了存储的值和
    下一个节点的指针，也就是位置。
    值可以传进去 指针赋值为 nullptr

    用cpp实现的话可以写构造函数，
    用c 可以写初始化函数来代替
*/
class Node{

};


/*
    单链表包含一个==头结点==
    初始化函数 使头结点初始为 nullptr
    析构函数  要清掉所有的节点 
*/
class SingleList{
    /*
        构造函数 用来初始化头节点。
    */
    SingleList(int data);

    /*
        析构函数 
        把头结点 赋值给 一个新的节点 
        当这个节点不空的前提下，使得节点向后移动
        然后释放这个节点   置为空
    */
    ~SingleList();

    /*
        判断单链表的节点是否为空节点，
        返回 head 是否为 空 的判断
    */
    bool isEmpty();

    /*
        头插法 
        创建新节点 初始化 
        如果空，那新节点就是头结点 
        如果不为空，那新节点的下一个节点就是头结点
        同时新节点成为头结点
    */
    void insertAtHead(int data);

    /*
        尾插法 
        创建新节点 初始化 
        如果空，同上
        不空 ， 首先需要创建一个当前(current)节点，
        使用这个当前节点遍历到链表的最后一个位置上
        也就是 current->next，然后开始赋值

    */
    void insertAtTail(int data);

    /*
        display 作用是查看链表中的元素
        空 提示空链表 
        注意要用 当前的节点遍历到最后 不要漏掉最后一个节点
        不空 使用一个当前节点遍历到整个链表末尾 
        遍历的过程中 一边进行遍历一边输出节点的值 
    */
    void display();

    /*
        delete函数是用来删除链表当中的节点的 
        首先如果链表为空，也就没必要删除了 提示空链表
        不为空 
        如果删除的是 头结点 声明一个临时节点 头结点后移 删除这个临时节点 
            一定要返回 ！！！
        非头结点 创建两个节点 
        当前节点 从头结点开始 因为头结点前面没有其他节点 所以先前节点置为空
        之后当我们头结点不为空且 要删除的值不是头结点的值，使得
        先前节点 = 当前节点 当前后移 
        如果当前节点不空  之前的下一个 = 现在的下一个 同时释放当前节点
        否则节点不存在
    */
    void deleteNode(int data);

};

/*
    主函数里一般是用来展示上面你自己实现的功能
*/
int main(){

    return 0;
}
